package prassein.rsm.common.utils;

import java.io.BufferedInputStream;  
import java.io.File;  
import java.io.FileInputStream;  
import java.io.FileOutputStream;  
import java.util.zip.CRC32;  
import java.util.zip.CheckedOutputStream;  
  
import org.apache.tools.zip.ZipEntry;  
import org.apache.tools.zip.ZipOutputStream;  

public class ZipCompressor {

	static final int BUFFER = 8192;  
	  
    private File zipFile;  
  
    public ZipCompressor(String pathName) {  
        zipFile = new File(pathName);  
    }  
  
    public void compress(String srcPathName) {  
        File file = new File(srcPathName);  
        if (!file.exists())  
            throw new RuntimeException(srcPathName + "不存在！");  
        try {  
            FileOutputStream fileOutputStream = new FileOutputStream(zipFile);  
            CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream,  
                    new CRC32());  
            ZipOutputStream out = new ZipOutputStream(cos);  
            String basedir = "";  
            compress(file, out, basedir);  
            out.close();  
        } catch (Exception e) {  
            throw new RuntimeException(e);  
        }  
    }  
  
    private void compress(File file, ZipOutputStream out, String basedir) {  
        /* 判断是目录还是文件 */  
        if (file.isDirectory()) {  
            System.out.println("压缩：" + basedir + file.getName());  
            this.compressDirectory(file, out, basedir);  
        } else {  
            System.out.println("压缩：" + basedir + file.getName());  
            this.compressFile(file, out, basedir);  
        }  
    }  
  
    /** 压缩一个目录 */  
    private void compressDirectory(File dir, ZipOutputStream out, String basedir) {  
        if (!dir.exists())  
            return;  
  
        File[] files = dir.listFiles();  
        for (int i = 0; i < files.length; i++) {  
            /* 递归 */  
            compress(files[i], out, basedir + dir.getName() + "/");  
        }  
    }  
  
    /** 压缩一个文件 */  
    private void compressFile(File file, ZipOutputStream out, String basedir) {  
        if (!file.exists()) {  
            return;  
        }  
        try {  
            BufferedInputStream bis = new BufferedInputStream(  
                    new FileInputStream(file));  
            ZipEntry entry = new ZipEntry(basedir + file.getName());  
            out.putNextEntry(entry);  
            int count;  
            byte data[] = new byte[BUFFER];  
            while ((count = bis.read(data, 0, BUFFER)) != -1) {  
                out.write(data, 0, count);  
            }  
            bis.close();  
        } catch (Exception e) {  
            throw new RuntimeException(e);  
        }  
    } 

//	// 解压指定zip文件
//
//	public void unZip(String unZipfileName) {// unZipfileName需要解压的zip文件名
//
//		FileOutputStream fileOut;
//
//		File file;
//
//		try {
//
//			this.zipIn = new ZipInputStream(new BufferedInputStream(
//					new FileInputStream(unZipfileName)));
//
//			while ((this.zipEntry = this.zipIn.getNextEntry()) != null) {
//
//				file = new File(this.zipEntry.getName());
//
//				// System.out.println(file);///
//
//				if (this.zipEntry.isDirectory()) {
//
//					file.mkdirs();
//
//				}
//
//				else {
//
//					// 如果指定文件的目录不存在,则创建之.
//
//					File parent = file.getParentFile();
//
//					if (!parent.exists()) {
//
//						parent.mkdirs();
//
//					}
//
//					fileOut = new FileOutputStream(file);
//
//					while ((this.readedBytes = this.zipIn.read(this.buf)) > 0) {
//
//						fileOut.write(this.buf, 0, this.readedBytes);
//
//					}
//
//					fileOut.close();
//
//				}
//
//				this.zipIn.closeEntry();
//
//			}
//
//		} catch (IOException ioe) {
//
//			ioe.printStackTrace();
//
//		}
//	}
}
